大家會不會好奇那麼多程式碼,背後到底是誰推進的呢?
那會是怎麼樣的機制呢?
答案是線程(Thread), 在程式碼背後 他就像一個馬達驅動程式碼的執行
在 非主線程 執行異步程式碼 , 當執行完成獲取執行結果後 , 想要更新 UI 畫面 , 這時候可以透過調用主線程 的 Handler 在 非主線程 中 發送 Message 到 主線程的 MessageQueue , 等到輪到這個 Message 時, Looper 將這個 Message取出 , 這個發送的 Handler 會處理這個Message , 去執行更新畫面
在Activity中新建一个handler , 當 handler 處理 發送的 Message , 會調用 Callback , 我們 可以在這個 callback 中獲取 在非主線程送出的訊息內容 , 並更新 UI 畫面
val handler = Handler(object:Handler.Callback{
override fun handleMessage(msg: Message): Boolean {
textView.text = "${msg.what}"
return true;
}
})
主線程 handler 在非主線程中 向主線程 MessageQueue 發送 Message
val thread = Thread (object :Runnable {
override fun run() {
try {
Thread.sleep(1000) //在非主線程 模擬一段耗時操作,比如請求網絡
handler.sendEmptyMessage(0)
} catch (e: InterruptedException) {
e.printStackTrace()
}
}
})
明天我們 會利用 Runnable (也是會包成 Message 發送到 MessageQueue ) 跟 Handler, 做出一個計時器
今天的源碼 https://github.com/liyiwin/Day3_Thread/tree/master/app